import axios from 'axios';
import { ElMessage, ElLoading } from 'element-plus';
import { ifValidateTokenTime } from '@/utils/auth.js';
import store from '@/store';
import qs from 'qs';
import { GM_SM4Decrypt } from '../utils/sm4Import';
const request = function request(config) {
  //  让请求在浏览器中允许跨域携带cookie
  // axios.defaults.withCredentials = true;
  // 创建axios实例
  // console.log(process.env)
  const service = axios.create({
    baseURL: process.env.VUE_APP_BASE_API,
    timeout: 100000,
    // headers: {
    //   "Content-Type": "application/json",
    // },
  });

  //   // 添加超时处理（axios中需要你根据error信息来进行判断）
  //   axios().catch((err) => {
  //     const {
  //       message
  //     } = err;
  //     if (err.code === 'ECONNABORTED' && message.indexOf('timeout') > -1) {
  //       // 超时处理，可以直接弹出错误或者重新发送一次请求
  //       alert("请求超时，请检查网络问题");
  //       // let newhttp = new Promise(resolve => {
  //       //   resolve()
  //       // })
  //       // return newhttp.then(() => {
  //       //   return axios.create({
  //       //     baseURL: '',
  //       //     timeout: 5000
  //       //   })
  //       // })
  //     }
  //     //   如果不是则返回错误
  //     return Promise.reject(error);
  //   })

  // 请求拦截器
  service.interceptors.request.use(
    (config) => {
      if (
        config.method === 'post' &&
        config.headers['Content-Type'] ===
          'application/x-www-form-urlencoded;charset=UTF-8'
      ) {
        config.data = qs.stringify(config.data);
      }
      //  1.可以修改config中的字段
      //  if (localStorage.getItem('token')) {
      //      confing.headers.ACCESS_TOKEN = localStorage.getItem('token');
      //  }
      //  2.可以加一些网络请求过程中显示的图标，例如加载中...
      // console.log(config)
      if (localStorage.getItem('token')) {
        // 验证token
        config.headers.common['Authorization'] =
          'Bearer ' + localStorage.getItem('token');
        if (ifValidateTokenTime()) {
          store.dispatch('app/logout');
          return Promise.reject(new Error('token过期了！'));
        }
      }
      // startLoading();
      return config; //拦截后，有且必须有一个config对象被返回
    },
    (err) => {
      return Promise.reject(err);
    },
  );

  //响应拦截器  服务器的返回状态
  service.interceptors.response.use(
    (response) => {
      // console.log(response)
      // if (response && response.status == 200) {
      //   return response.data;
      // }
      const { statusCode, message, data } = response.data;
      if (
        statusCode === 200 ||
        statusCode === 201 ||
        statusCode === 202 ||
        statusCode === 203
      ) {
        // console.log(data)
        if (data != null || data != undefined) {
          let decryptData = JSON.parse(GM_SM4Decrypt(data));
          // console.log(decryptData)
          return decryptData;
        } else {
          // console.log(data)
          return data;
        }
      } else {
        return Promise.reject(new Error(message));
      }
    },
    (err) => {
      // err.response && console.log(err.response.data);
      // err.response &&
      //   ElMessage({
      //     message: err.response.data,
      //     type: 'error',
      //   });
      if (err.response) {
        return Promise.reject(err.response.data);
      } else {
        return Promise.reject(err);
      }
    },
  );
  //发送网络请求
  return service(config);
};
const requestNoStrict = function request(config) {
  const service = axios.create({
    baseURL: process.env.VUE_APP_BASE_API,
    timeout: 100000,
  });
  // 请求拦截器
  service.interceptors.request.use(
    (config) => {
      if (
        config.method === 'post' &&
        config.headers['Content-Type'] ===
          'application/x-www-form-urlencoded;charset=UTF-8'
      ) {
        config.data = qs.stringify(config.data);
      }
      if (localStorage.getItem('token')) {
        // 验证token
        config.headers.common['Authorization'] =
          'Bearer ' + localStorage.getItem('token');
        // if (ifValidateTokenTime()) {
        //   store.dispatch('app/logout');
        //   return Promise.reject(new Error('token过期了！'));
        // }
      }
      return config; //拦截后，有且必须有一个config对象被返回
    },
    (err) => {
      return Promise.reject(err);
    },
  );
  //响应拦截器  服务器的返回状态
  service.interceptors.response.use(
    (response) => {
      // endLoading();
      const { status, data } = response;
      if (
        status === 200 ||
        status === 201 ||
        status === 202 ||
        status === 203
      ) {
        // console.log(data)
        return data;
      } else {
        return Promise.reject(new Error('请求错误！'));
      }
    },
    (err) => {
      if (err.response) {
        return Promise.reject(err.response.data);
      } else {
        return Promise.reject(err);
      }
    },
  );
  //发送网络请求
  return service(config);
};
let loadingInstance;
function startLoading() {
  let options = {
    fullscreen: true,
    lock: true, //是否锁定
    spinner: 'el-icon-loading',
    text: '请求中...', //加载中需要显示的文字
    background: 'rgba(0,0,0,.5)', //背景颜色
  };
  loadingInstance = ElLoading.service(options);
}
function endLoading() {
  loadingInstance && loadingInstance.close();
}
export { request, requestNoStrict };
